#include "SocketIO.h"
#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>

SocketIO::SocketIO(int fd)
: _fd(fd){

}

SocketIO::~SocketIO(){
    close(_fd);
}

//使用小火车协议接收客户端发送的数据
pair<string, int> SocketIO::readTrain(){
    //接收消息长度
    size_t len = 0;
    int ret = recv(_fd, &len, sizeof(size_t), MSG_WAITALL);
    if(ret == 0){
        return {"", 0};
    }
    //接收消息id
    int id = 0;
    recv(_fd, &id, sizeof(int), MSG_WAITALL);
    //接收消息内容
    char *buf = new char[len + 1](); //使用堆空间接收消息内容
    recv(_fd, buf, len, MSG_WAITALL);
    string json(buf, len);
    delete [] buf; //回收堆空间
    //返回消息内容和id的pair
    return {json, id};
}

//使用小火车协议给客户端发送数据
void SocketIO::sendTrain(const string &msg, int id){
    /* std::cout << "sendTrain: " << msg << std::endl; */
    size_t len = msg.size();
    send(_fd, &len, sizeof(size_t), 0); //发送消息长度
    send(_fd, &id, sizeof(int), 0); //发送消息id
    send(_fd, msg.c_str(), len, 0); //发送消息内容
}
